<?php
/**
 * Description of ProdutoDAO
 *
 * @author Magno
 */
class ProdutoDAO {

    private $conexao;
    private $leilaoDAO;
    private $mediaProdutoDAO;
    private $catProDAO;
    private $statusDAO;

    public function __construct() {
        $this->conexao = Conexao::getConexao();
        $this->leilaoDAO = new LeilaoDAO();
        $this->mediaProdutoDAO = new MediaProdutoDAO();
        $this->catProDAO = new CategoriaProdutoDAO();
        $this->statusDAO = new StatusDAO();
    }

    public function salvar($produto) {

        try {

            if ($produto->getProdutoID() != null && $produto->getProdutoID() > 0) {

                $statment = $this->conexao->prepare("UPDATE produto SET
                        descricao = :descricao,
                        valorMercado = :valorMercado,
                        peso = :peso,
                        categoriaProdutoID = :categoriaProdutoID,
                        leilaoID = :leilaoID,
                        statusID = :statusID
                        WHERE produtoID = :produtoID");
            } else {

                $statment = $this->conexao->prepare("INSERT INTO produto(produtoID,descricao,valorMercado,peso,categoriaProdutoID,leilaoID,statusID)
                    VALUES (:produtoID,:descricao,:valorMercado,:peso,:categoriaProdutoID,:leilaoID,:statusID);");
            }

            if ($statment->execute($produto->toBD())) {

                if ($produto->getProdutoID() == null || $produto->getProdutoID() <= 0)
                    $produto->setProdutoID($this->conexao->lastInsertId());
                return $produto;
            }else {
                $erros = $statment->errorInfo();
                throw new Exception("Erro ProdutoDAO: " . $erros[2]);
            }
        } catch (PDOException $err) {
            throw new Exception("Erro ProdutoDAO:" . $err->getMessage());
        }
    }

    public function excluir($produtoID) {

        try {

            $statment = $this->conexao->prepare("DELETE FROM produto WHERE produtoID = :produtoID");
            $statment->bindParam(':produtoID', $produtoID);

            if (!$statment->execute()) {
                $erros = $statment->errorInfo();
                throw new Exception("Erro ProdutoDAO: " . $erros[2]);
            }
        } catch (PDOException $err) {
            throw new Exception("Erro ProdutoDAO:" . $err->getMessage());
        }
    }

    public function listar($pagina = 0, $descricao = "", $categoriaProdutoID = -1, $leilaoID = -1, $statusID = -1, $carregarDependencias = false) {
        try {

            $limite = Util::getPaginacao($pagina);
            $where = $this->getWhere($descricao, $categoriaProdutoID, $leilaoID, $statusID);
            $produtos = array();
            $statment = $this->conexao->query("SELECT * FROM produto u $where $limite");

            foreach ($statment->fetchAll(PDO::FETCH_SERIALIZE) as $row){
                $produto = new ProdutoBean($row['produtoID'], $row['descricao'], $row['peso'], $row['valorMercado']);
                $produto->setStatus($this->statusDAO->buscarPorID($row['statusID']));

                if($carregarDependencias){
                    $produto->setLeilao($this->leilaoDAO->buscarPorID($row['leilaoID']));
                    $produto->setCategoriaProduto($this->catProDAO->buscarPorID($row['categoriaProdutoID']));
                    $produto->setMediaProdutos($this->mediaProdutoDAO->listar(0, "", $row['produtoID']));
                }

                $produtos[] =  $produto;
            }

            return $produtos;
        } catch (PDOException $err) {
            throw new Exception("Erro ProdutoDAO:" . $err->getMessage());
        }
    }

    public function listarPorOrdem($pagina = 0, $tamanho = 0, $ordem = "produtoID", $direcao = "ASC", $carregarDependencias = false) {
        try {

            $limite = Util::getPaginacao($pagina,$tamanho);
            $produtos = array();
            $statment = $this->conexao->query("SELECT * FROM produto u ORDER BY u.$ordem $direcao $limite");

            foreach ($statment->fetchAll(PDO::FETCH_SERIALIZE) as $row){
                $produto = new ProdutoBean($row['produtoID'], $row['descricao'], $row['peso'], $row['valorMercado']);
                $produto->setStatus($this->statusDAO->buscarPorID($row['statusID']));

                if($carregarDependencias){
                    $produto->setLeilao($this->leilaoDAO->buscarPorID($row['leilaoID']));
                    $produto->setCategoriaProduto($this->catProDAO->buscarPorID($row['categoriaProdutoID']));
                    $produto->setMediaProdutos($this->mediaProdutoDAO->listar(0, "", $row['produtoID']));
                }

                $produtos[] = $produto;
            }

            return $produtos;
        } catch (PDOException $err) {
            throw new Exception("Erro ProdutoDAO:" . $err->getMessage());
        }
    }

    public function buscarPorID($produtoID, $carregarDependencias = false) {
        try {

            $row = $this->conexao->query("SELECT * FROM produto WHERE produtoID = $produtoID ")->fetch(PDO::FETCH_SERIALIZE);

            if (isset ($row['produtoID']) && $row['produtoID'] > 0) {
                $produto = new ProdutoBean($row['produtoID'], $row['descricao'], $row['peso'], $row['valorMercado']);
                $produto->setStatus($this->statusDAO->buscarPorID($row['statusID']));

                if($carregarDependencias){
                    $produto->setLeilao($this->leilaoDAO->buscarPorID($row['leilaoID']));
                    $produto->setCategoriaProduto($this->catProDAO->buscarPorID($row['categoriaProdutoID']));
                    $produto->setMediaProdutos($this->mediaProdutoDAO->listar(0, "", $row['produtoID']));
                }
                
                return $produto;
            } else {
                return null;
            }
        } catch (PDOException $err) {
            throw new Exception("Erro ProdutoDAO:" . $err->getMessage());
        }
    }

    protected function getWhere($descricao = "", $categoriaProdutoID = -1, $leilaoID = -1, $statusID = -1) {

        $where = " WHERE 1 = 1 ";

        if (isset($descricao) && strlen($descricao) > 0) {
            $where = $where . " AND u.descricao like '%$descricao%' ";
        }

        if (isset($categoriaProdutoID) && $categoriaProdutoID > 0) {
            $where = $where . " AND u.categoriaProdutoID = $categoriaProdutoID ";
        }

        if (isset($leilaoID) && $leilaoID > 0) {
            $where = $where . " AND u.leilaoID = $leilaoID ";
        }

        if (isset($statusID) && $statusID > 0) {
            $where = $where . " AND u.statusID = $statusID ";
        }

        return $where;
    }

    public function total($descricao = "", $categoriaProdutoID = -1, $leilaoID = -1, $statusID = -1) {
        try {
            $where = $this->getWhere($descricao, $categoriaProdutoID, $leilaoID, $statusID);
            $total = $this->conexao->query("SELECT COUNT(u.produtoID) total FROM produto u $where")->fetch(PDO::FETCH_COLUMN);
            return $total;
        } catch (PDOException $err) {
            throw new Exception("Erro ProdutoDAO:" . $err->getMessage());
        }
    }

}
?>